package exercises.leetcode;

import java.util.Arrays;

/**
 * <a href="">
 * 5903. 简易银行系统</a>
 *
 * <p><span color="#87CEEB">描述:</span>
 * 你的任务是为一个很受欢迎的银行设计一款程序，以自动化执行所有传入的交易（转账，存款和取款）。银行共有 n 个账户，编号从 1 到 n 。每个账号的初始余额存储在一个下标从 0 开始的整数数组 balance 中，其中第 (i + 1) 个账户的初始余额是 balance[i] 。
 * <p>
 * 请你执行所有 有效的 交易。如果满足下面全部条件，则交易 有效 ：
 * <p>
 * 指定的账户数量在 1 和 n 之间，且
 * 取款或者转账需要的钱的总数 小于或者等于 账户余额。
 * 实现 Bank 类：
 * <p>
 * Bank(long[] balance) 使用下标从 0 开始的整数数组 balance 初始化该对象。
 * boolean transfer(int account1, int account2, long money) 从编号为 account1 的账户向编号为 account2 的账户转帐 money 美元。如果交易成功，返回 true ，否则，返回 false 。
 * boolean deposit(int account, long money) 向编号为 account 的账户存款 money 美元。如果交易成功，返回 true ；否则，返回 false 。
 * boolean withdraw(int account, long money) 从编号为 account 的账户取款 money 美元。如果交易成功，返回 true ；否则，返回 false 。
 *
 * @author or2
 * @date 2021年10月17日 时间: 10:58
 */
public class No5903 {
    private static class Bank {

        long[] accounts;
        public Bank(long[] balance) {
            accounts = Arrays.copyOf(balance, balance.length);
        }

        public boolean transfer(int account1, int account2, long money) {
            if (checkIndex(--account1) || checkIndex(--account2))
                return false;
            if (accounts[account1] < money)
                return false;

            accounts[account1] -= money;
            accounts[account2] += money;
            return true;
        }

        public boolean deposit(int account, long money) {
            if (checkIndex(--account))
                return false;
            accounts[account] += money;
            return true;
        }

        public boolean withdraw(int account, long money) {
            if (checkIndex(--account))
                return false;
            if (accounts[account] < money)
                return false;

            accounts[account] -= money;
            return true;
        }

        private boolean checkIndex(int index){
            return index < 0 || index >= accounts.length;
        }
    }

    public static void main(String[] args) {
        No5903 no5903 = new No5903();
        Bank bank = new Bank(new long[]{10, 100, 20, 50, 30});
        bank.withdraw(3, 10);
        bank.transfer(5, 1, 20);
    }
}
